home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / x / volume3 / browserw / part01 next >
Encoding:
Internet Message Format  |  1989-02-17  |  49.5 KB

  1. Path: uunet!wyse!mikew
  2. From: mikew@wyse.wyse.com (Mike Wexler)
  3. Newsgroups: comp.sources.x
  4. Subject: v03i014:  file browsing widget, Part01/01
  5. Message-ID: <2064@wyse.wyse.com>
  6. Date: 17 Feb 89 17:17:31 GMT
  7. Organization: Wyse Technology, San Jose
  8. Lines: 1876
  9. Approved: mikew@wyse.com
  10.  
  11. Submitted-by: shipley@web.berkeley.edu
  12. Posting-number: Volume 3, Issue 14
  13. Archive-name: browserw/part01
  14.  
  15. #! /bin/sh
  16. # This is a shell archive.  Remove anything before this line, then unpack
  17. # it by saving it into a file and typing "sh file".  To overwrite existing
  18. # files, type "sh file -c".  You can also feed this as standard input via
  19. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  20. # will see the following message at the end:
  21. #        "End of archive 1 (of 1)."
  22. # Contents:  README AUTHOR Browser.c Browser.h BrowserP.h
  23. #   ListWidget.patch Makefile browser.3x main.c patchlevel.h
  24. # Wrapped by mikew@wyse on Fri Feb 17 09:15:16 1989
  25. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  26. if test -f 'README' -a "${1}" != "-c" ; then 
  27.   echo shar: Will not clobber existing file \"'README'\"
  28. else
  29. echo shar: Extracting \"'README'\" \(391 characters\)
  30. sed "s/^X//" >'README' <<'END_OF_FILE'
  31. XThis Directory contains the source for a Directory Browser Widget and a
  32. Xtest program.  For this program to work the Athena List widget must
  33. Xwork also I and included a patch that will stop the Athena List widget
  34. Xfrom dumping core (this patch dose not fix the problem cause, just the
  35. Xsymptom).  Please mail any bug (and/or fixes) to:
  36. X    
  37. X    shipley@widow.Berkeley.Edu
  38. X        -or-
  39. X    ucbvax!widow!shipley
  40. END_OF_FILE
  41. if test 391 -ne `wc -c <'README'`; then
  42.     echo shar: \"'README'\" unpacked with wrong size!
  43. fi
  44. # end of 'README'
  45. fi
  46. if test -f 'AUTHOR' -a "${1}" != "-c" ; then 
  47.   echo shar: Will not clobber existing file \"'AUTHOR'\"
  48. else
  49. echo shar: Extracting \"'AUTHOR'\" \(713 characters\)
  50. sed "s/^X//" >'AUTHOR' <<'END_OF_FILE'
  51. X(Message inbox:687)
  52. XReturn-Path: shipley%WEB.Berkeley.EDU@lilac.berkeley.edu
  53. XReceived:  by wyse.wyse.com (5.58/Wyse master/5-13-88)
  54. X    id AA07715; Sat, 31 Dec 88 03:05:26 PST
  55. XFrom: shipley%WEB.Berkeley.EDU@lilac.berkeley.edu
  56. XReceived: from lilac.Berkeley.EDU by uunet.UU.NET (5.59/1.14) 
  57. X    id AA02624; Sat, 31 Dec 88 01:00:15 EST
  58. XReceived: from web-2e.berkeley.edu
  59. X    by lilac.berkeley.edu (5.54 (CFC 4.22.3)/1.16.18B)
  60. X    id AA13855; Fri, 30 Dec 88 21:58:39 PST
  61. XReceived: by web-2e.berkeley.edu (3.2/SMI-3.0DEV3.9MXl)
  62. X    id AA02582; Fri, 30 Dec 88 22:01:50 PST
  63. XDate: Fri, 30 Dec 88 22:01:50 PST
  64. XMessage-Id: <8812310601.AA02582@web-2e.berkeley.edu>
  65. XTo: mikew@wyse.wyse.com
  66. XSubject: BrowserWidget
  67. X
  68. X
  69. Xmkdir Browser
  70. Xcd Browser
  71. END_OF_FILE
  72. if test 713 -ne `wc -c <'AUTHOR'`; then
  73.     echo shar: \"'AUTHOR'\" unpacked with wrong size!
  74. fi
  75. # end of 'AUTHOR'
  76. fi
  77. if test -f 'Browser.c' -a "${1}" != "-c" ; then 
  78.   echo shar: Will not clobber existing file \"'Browser.c'\"
  79. else
  80. echo shar: Extracting \"'Browser.c'\" \(31119 characters\)
  81. sed "s/^X//" >'Browser.c' <<'END_OF_FILE'
  82. X#if ( !defined(lint) && !defined(Pete_copyright))
  83. X#define Pete_copyright 1
  84. Xstatic char pete_copyright[] = "\
  85. X Copyright 1986 by Peter Shipley All rights reserved\n\
  86. X\n\
  87. X Copy permission is hereby granted provided that this notice is\n\
  88. X retained on all partial or complete copies.\n\
  89. X\n\
  90. X please mail questions and fixes to shipley@widow,berkeley.edu\n";
  91. X#endif
  92. X
  93. X
  94. X#include <stdio.h>
  95. X#include <errno.h>
  96. X#include <ctype.h>
  97. X#include <sys/types.h>
  98. X#include <sys/stat.h>
  99. X#include <sys/file.h>
  100. X#include <sys/param.h>
  101. X#include <sys/dir.h>
  102. X#include <signal.h>
  103. X
  104. X#include <X11/Xlib.h>
  105. X#include <X11/IntrinsicP.h>
  106. X/*
  107. X#include <X11/Shell.h>
  108. X#include <X11/Form.h>
  109. X*/
  110. X#include <X11/cursorfont.h>
  111. X/* #include <X11/Xlibint.h> */
  112. X#include <X11/AsciiText.h>
  113. X#include <X11/StringDefs.h>
  114. X#include <X11/Xos.h>
  115. X#include <X11/Xutil.h>
  116. X#include <X11/Command.h>
  117. X#include <X11/List.h>
  118. X#include <X11/Viewport.h>
  119. X#include <X11/Xmu.h>
  120. X
  121. X
  122. X#include "BrowserP.h"
  123. X
  124. X/* Private Definitions */
  125. X
  126. Xstatic int def_spacing = 10;
  127. X
  128. X
  129. X    /* {name, class, type, size, offset, default_type, default_addr}, */
  130. Xstatic XtResource resources[] = {
  131. X    {XtNvalue, XtCValue, XtRString, sizeof(String),
  132. X    XtOffset(BrowserWidget, browser.path), XtRString, NULL},
  133. X    {XtNdefaultDistance, XtCThickness, XtRInt, sizeof(int),
  134. X    XtOffset(BrowserWidget, browser.spacing), XtRInt,(caddr_t)&def_spacing},
  135. X    {XtNcancelCallback, XtCCallback, XtRCallback, sizeof(caddr_t),
  136. X    XtOffset(BrowserWidget, browser.sel_callback), XtRCallback, NULL},
  137. X    {XtNopenCallback, XtCCallback, XtRCallback, sizeof(caddr_t),
  138. X    XtOffset(BrowserWidget, browser.can_callback), XtRCallback, NULL},
  139. X    {XtNfunction, XtCFunction, XtRFunction, sizeof (XtWorkProc),
  140. X    XtOffset(BrowserWidget, browser.testProc), XtRFunction, NULL},
  141. X    {XtNreverseVideo, XtCReverseVideo, XtRBoolean, sizeof (Boolean),
  142. X    XtOffset(BrowserWidget, browser.reverse_video), XtRString, "FALSE"}
  143. X};
  144. X
  145. Xstatic Boolean SetValues(), ConstraintSetValues();
  146. Xstatic XtGeometryResult GeometryManager();
  147. Xstatic list_type *createFileList();
  148. X
  149. Xextern int alphasort();
  150. X
  151. X
  152. Xstatic void CreateLabelWidget(),    /* random Widget creation func. */
  153. X        CreateFileListWidget(),
  154. X        CreateErrorWidget(),
  155. X        CreateCommandButtons(),
  156. X
  157. X        CreateCursors(),
  158. X
  159. X        followdir(),
  160. X        Bdestroy(),            /* callback to deallocate shit */
  161. X                    /* toolkit failures */
  162. X
  163. X        UpDateLabel(),        /* Update the path label */
  164. X        LocalNotify(),        /* generic callback */
  165. X#ifdef DEBUG
  166. X        showList(),            /* DEBUG func. (prints current list) */
  167. X#endif DEBUG
  168. X
  169. X        prev_callback(),
  170. X        next_callback(),
  171. X        path_completion(),
  172. X        kill_callback(),
  173. X
  174. X        dummy(),            /* a do nothing func. */
  175. X
  176. X        _openCall(),        /* callback for open button */
  177. X        _cancelCall(),        /* callback for cancel button */
  178. X
  179. X        ChangeManaged(),
  180. X        Initialize(),
  181. X        Resize(),
  182. X        Realize(),
  183. X        RefigureLocations(),
  184. X        ConstraintInitialize(),
  185. X
  186. X        showError(),
  187. X        clearError(),
  188. X
  189. X        SetWorkState(),
  190. X
  191. X        deleteList();        /* de-allocate current list */
  192. X
  193. X#ifdef DEBUG
  194. X#define printList(X) (void) fprintf(stderr, \
  195. X    "list->count = %d\tmin = '%s'\tmax = '%s'\n", \
  196. X    X->count, X->namelist[0],  X->namelist[X->count -1]);
  197. X#endif DEBUG
  198. X
  199. X
  200. X
  201. X
  202. XBrowserClassRec browserClassRec = {
  203. X  { /* core_class fields */
  204. X    /* superclass         */    (WidgetClass) &compositeClassRec,
  205. X    /* class_name         */    "Browser",
  206. X    /* widget_size        */    sizeof(BrowserRec),
  207. X    /* class_initialize   */    NULL,
  208. X    /* class_part_init    */    NULL,
  209. X    /* class_inited       */    FALSE,
  210. X    /* initialize         */    Initialize,
  211. X    /* initialize_hook    */    NULL,
  212. X    /* realize            */    Realize,
  213. X    /* actions            */    NULL,
  214. X    /* num_actions        */    0,
  215. X    /* resources          */    resources,
  216. X    /* num_resources      */    XtNumber(resources),
  217. X    /* xrm_class          */    NULLQUARK,
  218. X    /* compress_motion    */    TRUE,
  219. X    /* compress_exposure  */    TRUE,
  220. X    /* compress_enterleave*/    TRUE,
  221. X    /* visible_interest   */    FALSE,
  222. X    /* destroy            */    Bdestroy,
  223. X    /* resize             */    Resize,
  224. X    /* expose             */    XtInheritExpose,
  225. X    /* set_values         */    SetValues,
  226. X    /* set_values_hook    */    NULL,
  227. X    /* set_values_almost  */    XtInheritSetValuesAlmost,
  228. X    /* get_values_hook    */    NULL,
  229. X    /* accept_focus       */    NULL,
  230. X    /* version            */    XtVersion,
  231. X    /* callback_private   */    NULL,
  232. X    /* tm_table           */    NULL,
  233. X    /* query_geometry     */    XtInheritQueryGeometry,    /* %%% fix this! */
  234. X    /* display_accelerator*/    XtInheritDisplayAccelerator,
  235. X    /* extension          */    NULL
  236. X  },
  237. X  { /* composite_class fields */
  238. X    /* geometry_manager   */   GeometryManager,
  239. X    /* change_managed     */   NULL, /* ChangeManaged, */
  240. X    /* insert_child       */   XtInheritInsertChild,
  241. X    /* delete_child       */   XtInheritDeleteChild,
  242. X    /* extension          */   NULL
  243. X  },
  244. X  { /* browser_class fields */
  245. X    /* empty              */   0
  246. X  }
  247. X};
  248. X
  249. XWidgetClass browserWidgetClass = (WidgetClass)&browserClassRec;
  250. X
  251. X/****************************************************************
  252. X *
  253. X * Private Procedures
  254. X *
  255. X ****************************************************************/
  256. X
  257. Xstatic void CreateCursors(br)
  258. XBrowserWidget br;
  259. X{
  260. X
  261. Xstatic XColor b = { 0,    0,     0,     0  };  /* black */
  262. Xstatic XColor f = { 0, 65535, 65535, 65535 };  /* white */
  263. X
  264. X#ifdef nodef
  265. XXColor f, b;
  266. X
  267. X    if (XtDisplay(br)->cursor_font == None) {
  268. X    XtDisplay(br)->cursor_font = XLoadFont (XtDisplay(br), CURSORFONT);
  269. X    if (XtDisplay(br)->cursor_font) {
  270. X        XtWarning("failed to open cursor_font");
  271. X        return;
  272. X    }
  273. X    }
  274. X
  275. X    if(br->browser.reverse_video) {
  276. X    f = foreground;
  277. X    b = background;
  278. X    } else {
  279. X    b = foreground;
  280. X    f = background;
  281. X    }
  282. X
  283. X    br->browser.ArrowCursor = XCreateGlyphCursor(XtDisplay(br),
  284. X        XtDisplay(br)->cursor_font, XtDisplay(br)->cursor_font,
  285. X        XC_left_ptr, XC_left_ptr +1, &f, &b);
  286. X
  287. X    br->browser.CrossCursor = XCreateGlyphCursor(XtDisplay(br),
  288. X        XtDisplay(br)->cursor_font, XtDisplay(br)->cursor_font,
  289. X        XC_cross, XC_cross +1, &f, &b);
  290. X
  291. X    br->browser.ClockCursor = XCreateGlyphCursor(XtDisplay(br),
  292. X        XtDisplay(br)->cursor_font, XtDisplay(br)->cursor_font,
  293. X        XC_watch, XC_watch +1, &f, &b);
  294. X#endif nodef
  295. X
  296. X    /* get the standard Cursors */
  297. X    br->browser.ArrowCursor = XCreateFontCursor(XtDisplay(br), XC_left_ptr);
  298. X    br->browser.CrossCursor = XCreateFontCursor(XtDisplay(br), XC_cross);
  299. X    br->browser.ClockCursor = XCreateFontCursor(XtDisplay(br), XC_watch);
  300. X
  301. X    /* recolor cursor is we are displayed in reverse video. */
  302. X    if(br->browser.reverse_video) {
  303. X    XRecolorCursor(XtDisplay(br), br->browser.CrossCursor, &f, &b);
  304. X    XRecolorCursor(XtDisplay(br), br->browser.ClockCursor, &f, &b);
  305. X    }
  306. X
  307. X    return;
  308. X}
  309. X
  310. X/* ARGSUSED */
  311. Xstatic void Initialize(request, new)
  312. X    Widget request, new;
  313. X{
  314. X    BrowserWidget br = (BrowserWidget)new;
  315. X
  316. X
  317. X    if(br->core.width == 0) br->core.width = 400;
  318. X    if(br->core.height == 0) br->core.height = 350;
  319. X
  320. X    /* allocate room for path data */
  321. X    br->browser.labelpath = XtMalloc(MAXPATHLEN);
  322. X    br->browser.basepath = XtMalloc(MAXPATHLEN);
  323. X
  324. X    /* labelpath NEEDS to be  NULL */
  325. X    bzero(br->browser.labelpath, MAXPATHLEN);
  326. X
  327. X    /* copy the base into an interal string */
  328. X    (void) strcpy(br->browser.basepath, br->browser.path);
  329. X
  330. X    CreateCursors(br);
  331. X
  332. X    /* get the dirt on the basepath */
  333. X    br->browser.list = (list_type *) createFileList(br, br->browser.path);
  334. X
  335. X#ifdef DEBUG
  336. X    showList(br->browser.list);
  337. X#endif DEBUG
  338. X
  339. X    /* Guess what these do ... */
  340. X    CreateLabelWidget(br);
  341. X
  342. X    CreateErrorWidget(br);
  343. X
  344. X    CreateFileListWidget(br);
  345. X
  346. X    CreateCommandButtons(br);
  347. X
  348. X    /* set the Keyboard Focus */
  349. X    XtSetKeyboardFocus(br, br->browser.b_label);
  350. X
  351. X    /* display the current path */
  352. X    UpDateLabel(br, TRUE);
  353. X
  354. X    return;
  355. X}
  356. X
  357. X
  358. Xstatic void CreateLabelWidget(br)
  359. XBrowserWidget br;
  360. X{
  361. XXtTranslations  text_tran;
  362. X
  363. X    static String newtextTranslations =
  364. X       "Ctrl<Key>W:        prev_callback()\n\
  365. X    Ctrl<Key>M:        next_callback()\n\
  366. X    Ctrl<Key>J:        next_callback()\n\
  367. X    <Key>0xFF0D:        next_callback()\n\
  368. X    <Key>0xFF0A:        next_callback()\n\
  369. X    Meta<Key>I:        dummy()\n\
  370. X    Ctrl<Key>C:        kill_callback()\n\
  371. X    <Key>0xFF1B:        path_completion()\n\
  372. X    Ctrl<Key>[:        path_completion()\n";
  373. X
  374. X    static XtActionsRec newtext_actions[] = {
  375. X    {"prev_callback",    prev_callback},
  376. X    {"next_callback",    next_callback},
  377. X    {"path_completion",    path_completion},
  378. X    {"kill_callback",    kill_callback},
  379. X    {"dummy",        dummy}
  380. X    };
  381. X
  382. X    static Arg label_arg[] = {
  383. X    {XtNstring,        (XtArgVal) NULL},
  384. X    {XtNcursor,        (XtArgVal) NULL},
  385. X    {XtNlength,        (XtArgVal) MAXPATHLEN},
  386. X    {XtNtextOptions,    (XtArgVal) editable},
  387. X    {XtNeditType,        (XtArgVal) XttextEdit},
  388. X    {XtNjustify,        (XtArgVal) XtJustifyLeft},
  389. X    {XtNborderWidth,    (XtArgVal) 0},
  390. X    {XtNresize,        (XtArgVal) FALSE}
  391. X    };
  392. X
  393. X    label_arg[0].value = (XtArgVal) br->browser.labelpath;
  394. X    label_arg[1].value = (XtArgVal) br->browser.CrossCursor;
  395. X
  396. X    br->browser.b_label = XtCreateManagedWidget("Browser_label",
  397. X        asciiStringWidgetClass, br, label_arg, XtNumber(label_arg));
  398. X
  399. X    /* install the new actions record */
  400. X    XtAddActions(newtext_actions, XtNumber(newtext_actions));
  401. X
  402. X    /* creat a Translation Table */
  403. X    text_tran = XtParseTranslationTable(newtextTranslations);
  404. X
  405. X    /* install the new Translation Table */
  406. X    XtOverrideTranslations(br->browser.b_label, text_tran);
  407. X
  408. X    return;
  409. X}
  410. X
  411. X
  412. Xstatic void CreateFileListWidget(br)
  413. XBrowserWidget br;
  414. X{
  415. XXtTranslations list_trans;
  416. X
  417. X    static Arg view_args[] = {
  418. X    {XtNallowVert,          (XtArgVal) TRUE},
  419. X    {XtNforceBars,          (XtArgVal) TRUE},
  420. X    {XtNresize,             (XtArgVal) FALSE},
  421. X    {XtNuseRight,           (XtArgVal) TRUE}
  422. X    };
  423. X
  424. X    static String newTranslations =
  425. X    "<Btn1Down>:    Set()\n\
  426. X    <Btn1Down>(2+): Notify()\n";
  427. X
  428. X    static XtCallbackRec list_call[] = {
  429. X    {(XtCallbackProc) _openCall,    (caddr_t) NULL},
  430. X    {(XtCallbackProc) NULL,        (caddr_t) NULL}
  431. X    };
  432. X
  433. X    static Arg list_args[] = {
  434. X    {XtNlist,        (XtArgVal) NULL},
  435. X    {XtNnumberStrings,    (XtArgVal) NULL},
  436. X    {XtNcallback,        (XtArgVal) list_call},
  437. X    {XtNverticalList,    (XtArgVal) TRUE},
  438. X    {XtNforceColumns,    (XtArgVal) 1},
  439. X    {XtNdefaultColumns,    (XtArgVal) 1},
  440. X    {XtNcolumnSpacing,    (XtArgVal) 1000}
  441. X    };
  442. X
  443. X
  444. X    list_call[0].closure = (caddr_t) br;
  445. X
  446. X    list_args[0].value = (XtArgVal) br->browser.list->list;
  447. X    list_args[1].value = (XtArgVal) br->browser.list->count;
  448. X
  449. X    /* create a viewport widget so the list widget will have scrollbars */
  450. X    br->browser.b_view = XtCreateManagedWidget( "view", viewportWidgetClass,
  451. X            br, view_args, XtNumber(view_args));
  452. X
  453. X    /* Create the list widget at a child of the viewport widget */
  454. X    br->browser.b_list = XtCreateManagedWidget( "list", listWidgetClass,
  455. X            br->browser.b_view, list_args, XtNumber(list_args));
  456. X
  457. X    /* Parse the replacement TranslationTable and install it */
  458. X    list_trans = XtParseTranslationTable(newTranslations);
  459. X    XtOverrideTranslations(br->browser.b_list, list_trans);
  460. X
  461. X    return;
  462. X}
  463. X
  464. Xstatic void CreateErrorWidget(br)
  465. XBrowserWidget br;
  466. X{
  467. X    static Arg error_list[] = {
  468. X    {XtNjustify,        (XtArgVal) XtJustifyLeft},
  469. X    {XtNborderWidth,    (XtArgVal) 0},
  470. X    {XtNresize,             (XtArgVal) FALSE},
  471. X    {XtNlabel,        (XtArgVal) ">"}
  472. X    };
  473. X
  474. X    br->browser.b_error = XtCreateManagedWidget("error", labelWidgetClass,
  475. X            br, error_list, XtNumber(error_list));
  476. X    return;
  477. X}
  478. X
  479. X
  480. Xstatic void CreateCommandButtons(br)
  481. XBrowserWidget br;
  482. X{
  483. X    static XtCallbackRec cancel_call[] = {
  484. X    {(XtCallbackProc) _cancelCall,    (caddr_t) NULL},
  485. X    {(XtCallbackProc) NULL,        (caddr_t) NULL}
  486. X    };
  487. X
  488. X    static XtCallbackRec open_call[] = {
  489. X    {(XtCallbackProc) _openCall,    (caddr_t) NULL},
  490. X    {(XtCallbackProc) NULL,        (caddr_t) NULL}
  491. X    };
  492. X
  493. X    static Arg comm_args[] = {
  494. X    {XtNcursor,        (XtArgVal) NULL},
  495. X    {XtNlabel,        (XtArgVal) "Open"},
  496. X    {XtNcallback,        (XtArgVal) open_call},
  497. X    {XtNresize,             (XtArgVal) FALSE},
  498. X    {XtNresizable,        (XtArgVal) FALSE},
  499. X    {XtNwidth,        (XtArgVal) 70}
  500. X    };
  501. X
  502. X    comm_args[0].value = (XtArgVal) br->browser.ArrowCursor;
  503. X
  504. X    /* compleate the callback data arrays */
  505. X    open_call[0].closure = cancel_call[0].closure = (caddr_t) br;
  506. X
  507. X    /* create the open button */
  508. X    br->browser.b_open = XtCreateManagedWidget( "open", commandWidgetClass,
  509. X            br, comm_args, XtNumber(comm_args) );
  510. X
  511. X    /* reuses the arg array for the Cancel button */
  512. X    comm_args[1].value = (XtArgVal) "Cancel";
  513. X    comm_args[2].value = (XtArgVal) cancel_call;
  514. X
  515. X    /* and now the Cancel command button */
  516. X    br->browser.b_cancel = XtCreateManagedWidget( "Cancel", commandWidgetClass,
  517. X            br, comm_args, XtNumber(comm_args));
  518. X
  519. X    return;
  520. X}
  521. X
  522. X
  523. Xstatic void RefigureLocations(wi)
  524. X    BrowserWidget wi;
  525. X{
  526. X    BrowserWidget br = (BrowserWidget)wi;
  527. X
  528. X    Position x, y, y1;
  529. X
  530. X#ifdef DEBUG
  531. X    (void) fputs("RefigureLocations called\n", stderr);
  532. X#endif DEBUG
  533. X
  534. X    /* first we do the label bar */
  535. X    XtConfigureWidget(br->browser.b_label,
  536. X        br->browser.spacing, br->browser.spacing,    /* x & y*/
  537. X        br->core.width -(br->browser.spacing *2)     /* width */
  538. X        -(br->browser.b_label->core.border_width *2),
  539. X        br->browser.b_label->core.height,        /* height */
  540. X        br->browser.b_label->core.border_width);    /* border */
  541. X
  542. X    /* here we calc the Y Position for the selection list & buttons  */
  543. X    y1 = br->browser.b_label->core.height
  544. X        +(br->browser.spacing *2)
  545. X        +(br->browser.b_label->core.border_width *2);
  546. X
  547. X
  548. X    /* calc the X Position for the buttons */
  549. X    x = br->core.width -br->browser.spacing -br->browser.b_cancel->core.width;
  550. X
  551. X    /* Position the first button */
  552. X    XtMoveWidget(br->browser.b_open, x, y1);
  553. X
  554. X    XtMoveWidget(br->browser.b_cancel, x, 
  555. X        y1 +br->browser.spacing
  556. X        +br->browser.b_open->core.height
  557. X        +(br->browser.b_open->core.border_width *2));
  558. X
  559. X
  560. X    /* here we calc the Y Position error area */
  561. X    y = br->core.height -br->browser.spacing -br->browser.b_error->core.height
  562. X        -(br->browser.b_error->core.border_width *2);
  563. X
  564. X    XtConfigureWidget(br->browser.b_error,
  565. X        br->browser.spacing, y,                /* x & y */
  566. X        br->core.width -(br->browser.spacing *2)        /* width */
  567. X        -(br->browser.b_error->core.border_width *2),
  568. X        br->browser.b_error->core.height,            /* height */
  569. X        br->browser.b_error->core.border_width);        /* border */
  570. X
  571. X
  572. X
  573. X    XtConfigureWidget(br->browser.b_view,
  574. X        br->browser.spacing, y1,                /* x & y */
  575. X        x -(br->browser.b_view->core.border_width *2)    /* width */
  576. X        -(br->browser.spacing *2),
  577. X        y -(br->browser.b_view->core.border_width *2)    /* height */
  578. X        -y1 -br->browser.spacing,
  579. X        br->browser.b_view->core.border_width);        /* border */
  580. X
  581. X    /* done */
  582. X    return;
  583. X}
  584. X
  585. X
  586. Xstatic void Realize(wi, value_mask, attributes)
  587. XWidget               wi;
  588. XMask                 *value_mask;
  589. XXSetWindowAttributes *attributes;
  590. X{
  591. X
  592. X#ifdef DEBUG
  593. X    (void) fputs("Realize called\n", stderr);
  594. X#endif DEBUG
  595. X
  596. X    XtCreateWindow(wi, (unsigned int) InputOutput,
  597. X    (Visual *) CopyFromParent, *value_mask, attributes);
  598. X
  599. X    RefigureLocations((BrowserWidget) wi);
  600. X
  601. X    XDefineCursor(XtDisplay(wi), XtWindow(wi),
  602. X            ((BrowserWidget) wi)->browser.CrossCursor);
  603. X
  604. X    return;
  605. X}
  606. X
  607. X
  608. Xstatic void Resize(w)
  609. X    Widget w;
  610. X{
  611. X
  612. X#ifdef DEBUG
  613. X    (void) fputs("Resize called\n", stderr);
  614. X#endif DEBUG
  615. X
  616. X    RefigureLocations((BrowserWidget) w);
  617. X
  618. X    return;
  619. X}
  620. X
  621. X
  622. X/* ARGSUSED */
  623. Xstatic XtGeometryResult GeometryManager(w, request, reply)
  624. X    Widget w;
  625. X    XtWidgetGeometry *request;
  626. X    XtWidgetGeometry *reply;    /* RETURN */
  627. X{
  628. X#ifdef DEBUG
  629. X    (void) fprintf(stderr, "GeometryManager called: %s\n", w->core.name);
  630. X#endif DEBUG
  631. X
  632. X    return XtGeometryNo;
  633. X}
  634. X
  635. X
  636. X
  637. X/* ARGSUSED */
  638. Xstatic Boolean SetValues(current, request, new)
  639. X    Widget current, request, new;
  640. X{
  641. X    BrowserWidget br = (BrowserWidget)new;
  642. X    BrowserWidget old = (BrowserWidget)current;
  643. X
  644. X#ifdef DEBUG
  645. X    (void) fputs("SetValues called\n", stderr);
  646. X#endif DEBUG
  647. X
  648. X    if(br->browser.path != old->browser.path
  649. X    || br->browser.path != NULL
  650. X        && (old->browser.path != NULL
  651. X        && strcmp(br->browser.path, old->browser.path)))
  652. X    {
  653. X    /* delete the old list */
  654. X    deleteList(old->browser.list);
  655. X
  656. X    /* copy the new path into a safe area */
  657. X    (void) strcpy(br->browser.basepath, br->browser.path);
  658. X
  659. X    /* create list of file to select from */
  660. X    br->browser.list = createFileList(br, br->browser.path);
  661. X
  662. X    /* Update the displayed list */
  663. X    XtListChange(br->browser.b_list, br->browser.list->list,
  664. X            br->browser.list->count, 0, TRUE);
  665. X
  666. X    /* update the displayed label */
  667. X    UpDateLabel(br, TRUE);
  668. X
  669. X    }
  670. X
  671. X    return( FALSE );
  672. X}
  673. X
  674. X/* this is the util. for creating file listings */
  675. Xstatic list_type *createFileList(br, selection)
  676. XBrowserWidget br;
  677. Xchar *selection;
  678. X{
  679. Xregister Cardinal    i;
  680. Xstruct stat stat_buf;
  681. Xlist_type *ret_list;
  682. Xextern errno;
  683. X
  684. X    errno = 0;
  685. X
  686. X    /* open requested directory */
  687. X    if (selection == (char *) NULL)
  688. X    selection = ".";
  689. X
  690. X    /* malloc the return list */
  691. X    ret_list = (list_type *) XtMalloc(sizeof (list_type));
  692. X
  693. X
  694. X    /* report fuckups */
  695. X    if (ret_list == NULL) {
  696. X    return (list_type *) NULL;
  697. X    }
  698. X
  699. X    ret_list->count =
  700. X        scandir(selection, &ret_list->namelist, br->browser.testProc,
  701. X        alphasort);
  702. X
  703. X    /* test the scaning */
  704. X    if(ret_list->count == -1) {
  705. X#ifdef DEBUG
  706. X    XtWarning("Fucked up in opening dir");
  707. X#endif DEBUG
  708. X    XtFree((char *) ret_list);
  709. X    return (list_type *) NULL;
  710. X    }
  711. X
  712. X    ret_list->list = (char **)XtCalloc(ret_list->count +1, sizeof(char *));
  713. X    ret_list->mode = (int *)  XtCalloc(ret_list->count, sizeof(int));
  714. X
  715. X    for(i=0; i < ret_list->count; i++) {
  716. X    int len;
  717. X    char tbuf[MAXNAMLEN +2];
  718. X
  719. X    /* get the length of the file name for later use [and reuse] */
  720. X    len = strlen(ret_list->namelist[i]->d_name) + 2;
  721. X
  722. X    /* copy file name into a new buffer */
  723. X    ret_list->list[i] =
  724. X        strcpy( XtMalloc(len), ret_list->namelist[i]->d_name);
  725. X
  726. X    /* copy the current directory into a tempory space */
  727. X    (void) strcpy(tbuf, selection);
  728. X
  729. X    /* add a "/" to the current directory path if it's not there already */
  730. X    if (tbuf[strlen(tbuf) -1] != '/')
  731. X        (void) strcat(tbuf, "/");
  732. X
  733. X    /* tack on the current file name */
  734. X    (void) strcat(tbuf, ret_list->list[i]);
  735. X
  736. X    /* get the status of our 'file', if we fail ignore the file */
  737. X    if ( stat(tbuf, &stat_buf) != 0 ) {
  738. X#ifdef DEBUG
  739. X        (void) perror(ret_list->namelist[i]->d_name);
  740. X        XtWarning("Fucked up in stating file");
  741. X#endif DEBUG
  742. X        showError(br, ret_list->list[i]);
  743. X        continue;
  744. X    }
  745. X
  746. X    ret_list->mode[i] = stat_buf.st_mode;
  747. X
  748. X    /* add the '/' to the end of the name to indicate directrices, etc..*/
  749. X    switch (ret_list->mode[i] & S_IFMT) {
  750. X        case S_IFDIR:
  751. X        (void) strcat(ret_list->list[i], "/");
  752. X        break;
  753. X        case S_IFSOCK:
  754. X        (void) strcat(ret_list->list[i], "=");
  755. X        break;
  756. X        default:
  757. X        if ( (stat_buf.st_mode & ~S_IFMT) & 0111)
  758. X            (void) strcat(ret_list->list[i], "*");
  759. X        break;
  760. X    }
  761. X    }
  762. X
  763. X    /* null out the next slot [it should be null from calloc but..] */
  764. X    ret_list->list[i +1] = (char *) NULL;
  765. X
  766. X#ifdef DEBUG
  767. X    printList(ret_list);
  768. X#endif DEBUG
  769. X
  770. X    /* return with our work */
  771. X    return ret_list;
  772. X}
  773. X
  774. X
  775. X/* A clean up utility */
  776. Xstatic void deleteList(dead_list)
  777. Xlist_type *dead_list;
  778. X{
  779. Xregister int i;
  780. X
  781. X    /* Test to see it we have a list */
  782. X    if(dead_list == (list_type *) NULL)
  783. X    return;
  784. X
  785. X    /* free the strings */
  786. X    for(i=0; i < dead_list->count; i++) {
  787. X    XtFree( (char *) dead_list->list[i]);
  788. X    }
  789. X
  790. X    XtFree((char *) dead_list->namelist);
  791. X    XtFree((char *) dead_list->list);
  792. X    XtFree((char *) dead_list);
  793. X
  794. X    return;
  795. X}
  796. X
  797. X
  798. X
  799. X/*ARGUSED*/
  800. Xstatic void _cancelCall(wi, client_data, call_data)
  801. XWidget wi;
  802. Xcaddr_t client_data;
  803. Xcaddr_t call_data;
  804. X{
  805. XBrowserWidget br = (BrowserWidget)client_data;
  806. X
  807. X    /* Change the Cursors to a clock so the they think we're fuckup */
  808. X    SetWorkState(br, TRUE);
  809. X
  810. X    /* Clear the error line*/
  811. X    clearError(br);
  812. X
  813. X    XtCallCallbacks((Widget) br, XtNcancelCallback, (char *) NULL);
  814. X
  815. X    /* Tell the user we are done */
  816. X    SetWorkState(br, FALSE);
  817. X
  818. X    return;
  819. X}
  820. X
  821. X
  822. X/*ARGUSED*/
  823. Xstatic void _openCall(wi, client_data, call_data)
  824. XWidget wi;
  825. Xcaddr_t client_data;
  826. Xcaddr_t call_data;
  827. X{
  828. Xint i;
  829. XXtListReturnStruct *ret_value;
  830. XBrowserWidget br = (BrowserWidget)client_data;
  831. X
  832. X    /* Clear the error line*/
  833. X    clearError(br);
  834. X
  835. X    /* get the current selected list */
  836. X    ret_value = XtListShowCurrent(br->browser.b_list);
  837. X    i = ret_value->index;
  838. X
  839. X    /* free as soon as we don't need */
  840. X    XtFree((char *)ret_value);
  841. X
  842. X
  843. X    /* test to see it there is a current seletion */
  844. X    if( i != XT_LIST_NONE ) {
  845. X
  846. X    /* Change the Cursors to a clock so the they think we're fuckup */
  847. X    SetWorkState(br, TRUE);
  848. X
  849. X    /* test if we are looking at a directory or not */
  850. X    if ( br->browser.list->mode[i] & (S_IFMT & S_IFDIR) )
  851. X        followdir(br, br->browser.list->namelist[i]->d_name);
  852. X    else
  853. X        XtCallCallbacks((Widget) br, XtNopenCallback,
  854. X                br->browser.list->namelist[i]->d_name);
  855. X
  856. X    /* Tell the user we are done */
  857. X    SetWorkState(br, FALSE);
  858. X
  859. X    }
  860. X
  861. X    return;
  862. X}
  863. X
  864. X
  865. X
  866. X
  867. Xstatic void followdir(br, new_path)
  868. XBrowserWidget br;
  869. XString new_path;
  870. X{
  871. Xregister u_int i;
  872. Xchar    *c;
  873. Xchar    t_path[MAXPATHLEN];
  874. Xlist_type *t_list;
  875. X
  876. X    /* reset the error index */
  877. X    clearError(br);
  878. X
  879. X#ifdef DEBUG
  880. X    (void) fputs("followdir\n", stderr);
  881. X#endif DEBUG
  882. X
  883. X    /* just in case save the old path and lists */
  884. X    (void) strcpy(t_path, br->browser.basepath);
  885. X    t_list = br->browser.list;
  886. X
  887. X    /* see it we are just backing up one dir, there has to be a better way.. */
  888. X    if( strncmp(new_path, "..", 2) == 0 ) {
  889. X
  890. X    /* get the last occurance of the char '/' in the string  */
  891. X    c = rindex(br->browser.basepath, '/');
  892. X
  893. X    /* report if it is not possible to back out */
  894. X    if(c == (char *)NULL) {
  895. X        showError(br, "Burp!: could not track '/'");
  896. X        return;
  897. X    }
  898. X
  899. X    /* check if we index'ed  to root's "/" */
  900. X    if ( c == br->browser.basepath ) {
  901. X        (void) strcpy(br->browser.basepath, "/");
  902. X    } else {
  903. X        /* Null out the rest of the string */
  904. X        while( *c != '\0') *c++ = '\0';
  905. X    }
  906. X
  907. X    } else {
  908. X
  909. X    i = strlen(br->browser.basepath) -1;
  910. X
  911. X    if (br->browser.basepath[i] != '/')
  912. X        (void) strcat(br->browser.basepath, "/");
  913. X
  914. X    (void) strcat(br->browser.basepath, new_path);
  915. X
  916. X    i = strlen(br->browser.basepath) -1;
  917. X
  918. X    if (br->browser.basepath[i] == '/')
  919. X        br->browser.basepath[i] = (char) NULL;
  920. X    }
  921. X
  922. X    /* create a new list of files useing the new base path */
  923. X    br->browser.list = createFileList(br, br->browser.basepath);
  924. X
  925. X    /* Test the new list, if error report it and restore old values */
  926. X    if (br->browser.list == (list_type *) NULL) {
  927. X    showError(br, br->browser.basepath);
  928. X    (void) strcpy(br->browser.basepath, t_path);
  929. X    br->browser.list = t_list;
  930. X    return;
  931. X    }
  932. X
  933. X    /* free the storage used by the current list */
  934. X    deleteList(t_list);
  935. X
  936. X#ifdef DEBUG
  937. X    showList(br->browser.list);
  938. X    (void) fprintf(stderr, "basepath = `%s`\n", br->browser.basepath);
  939. X#endif DEBUG
  940. X
  941. X    /* Update the path label with the new path */
  942. X    UpDateLabel(br, TRUE);
  943. X
  944. X    /* Update the listing with the new list */
  945. X    XtListChange(br->browser.b_list, br->browser.list->list, br->browser.list->count, 0, TRUE);
  946. X
  947. X    return;
  948. X}
  949. X
  950. X#ifdef DEBUG
  951. Xstatic void showList(ll)
  952. Xlist_type *ll;
  953. X{
  954. Xregister int i;
  955. X
  956. X    for (i=0; i < ll->count; i++)
  957. X    (void) fprintf(stderr,
  958. X    "%d:\tlist->list[i] = `%s`\tnamelist[i]->d_name= `%s`\tmode = %lo\n",
  959. X        i, ll->list[i], ll->namelist[i]->d_name, ll->mode[i]);
  960. X
  961. X    printList(ll);
  962. X
  963. X    return;
  964. X}
  965. X#endif DEBUG
  966. X
  967. Xstatic void UpDateLabel(br, copy)
  968. XBrowserWidget br;
  969. XBoolean copy;
  970. X{
  971. XXtTextPosition len;
  972. X
  973. X    /* Unset whatever maybe highlighted */
  974. X    XtTextUnsetSelection(br->browser.b_label);
  975. X
  976. X    /* copy the real path in the shown path */
  977. X    if(copy)
  978. X    (void) strcpy(br->browser.labelpath, br->browser.basepath);
  979. X
  980. X    /* get the length of the current path */
  981. X    len = (XtTextPosition) strlen(br->browser.labelpath);
  982. X
  983. X    /* set the last position in the buffer */
  984. X    XtTextSetLastPos(br->browser.b_label, len);
  985. X
  986. X    /* move the Cursor to the last position in the buffer */
  987. X    XtTextSetInsertionPoint(br->browser.b_label, len);
  988. X
  989. X    return;
  990. X}
  991. X
  992. X/* this is the callback for our widget when it it is destroyed */
  993. Xstatic void Bdestroy(wi)
  994. XWidget wi;
  995. X{
  996. X    BrowserWidget br = (BrowserWidget)wi;
  997. X
  998. X#ifdef DEBUG
  999. X    (void) fputs("Bdestroy called\n", stderr);
  1000. X#endif DEBUG
  1001. X
  1002. X    deleteList(br->browser.list);
  1003. X
  1004. X    XtFree(br->browser.basepath);
  1005. X    XtFree(br->browser.labelpath);
  1006. X
  1007. X    XFreeCursor(br->browser.ArrowCursor);
  1008. X    XFreeCursor(br->browser.CrossCursor);
  1009. X    XFreeCursor(br->browser.ClockCursor);
  1010. X
  1011. X    return;
  1012. X}
  1013. X
  1014. Xstatic void
  1015. Xprev_callback(wi)
  1016. XWidget wi;
  1017. X{
  1018. Xchar *c;
  1019. XBrowserWidget br = (BrowserWidget)XtParent(wi);
  1020. X
  1021. X    /* clear the error window */
  1022. X    clearError(br);
  1023. X
  1024. X    /* get the last occurance of the char '/' in the string  */
  1025. X    c = rindex(br->browser.labelpath, '/');
  1026. X
  1027. X    /* report if it is not possible to back out */
  1028. X    if(c == (char *)NULL) {
  1029. X    showError(br, "Burp!: could not track '/'");
  1030. X    XBell(XtDisplay(br), 0);
  1031. X    return;
  1032. X    }
  1033. X
  1034. X    /* check if we index'ed  to root's "/" */
  1035. X    if ( c == br->browser.labelpath ) {
  1036. X    (void) strcpy(br->browser.labelpath, "/");
  1037. X    } else {
  1038. X    /* Null out the rest of the string */
  1039. X    while( *c != '\0') *c++ = '\0';
  1040. X    }
  1041. X
  1042. X    /* have the label reflect the change */
  1043. X    UpDateLabel(br, FALSE);
  1044. X
  1045. X    return;
  1046. X}
  1047. X
  1048. Xstatic void next_callback(wi)
  1049. XWidget wi;
  1050. X{
  1051. Xstruct stat stat_buf;
  1052. XBrowserWidget br = (BrowserWidget)XtParent(wi);
  1053. X
  1054. X#ifdef DEBUG
  1055. X    (void) fputs("next_callback called\n", stderr);
  1056. X#endif DEBUG
  1057. X
  1058. X    /* turn off input and set the cursors to a clock */
  1059. X    SetWorkState(br, TRUE);
  1060. X
  1061. X    /* clear the error window */
  1062. X    clearError(br);
  1063. X
  1064. X    /* get the status of our 'file', if we fail ignore the file */
  1065. X    if ( stat(br->browser.labelpath, &stat_buf) != 0 ) {
  1066. X        showError(br, br->browser.labelpath);
  1067. X    }
  1068. X
  1069. X    if (stat_buf.st_mode & (S_IFMT & S_IFDIR) ) {
  1070. X        list_type *t_list = br->browser.list;
  1071. X
  1072. X        br->browser.list = createFileList(br, br->browser.labelpath);
  1073. X
  1074. X        /* Test the new list */
  1075. X        if (br->browser.list == (list_type *) NULL) {
  1076. X
  1077. X        /* (void) strcpy(br->browser.basepath, t_path); */
  1078. X        br->browser.list = t_list;
  1079. X        showError(br, br->browser.labelpath);
  1080. X        SetWorkState(br, FALSE);
  1081. X        return;
  1082. X        }
  1083. X
  1084. X        /* Update the listing with the new list */
  1085. X        XtListChange(br->browser.b_list, br->browser.list->list,
  1086. X                    br->browser.list->count, 0, TRUE);
  1087. X
  1088. X        (void) strcpy(br->browser.basepath, br->browser.labelpath);
  1089. X
  1090. X        /* this should not be needed */
  1091. X        UpDateLabel(br, FALSE);
  1092. X
  1093. X    } else
  1094. X        XtCallCallbacks(br, XtNopenCallback, br->browser.labelpath);
  1095. X
  1096. X    SetWorkState(br, FALSE);
  1097. X
  1098. X    return;
  1099. X}
  1100. X
  1101. Xstatic void path_completion(wi)
  1102. XWidget wi;
  1103. X{
  1104. Xchar *c;
  1105. Xint     len;
  1106. Xint    dir_count;
  1107. Xu_int   i;
  1108. Xu_int   hit=0;
  1109. Xchar    selection[MAXPATHLEN];
  1110. Xchar    name[MAXNAMLEN];
  1111. Xstruct direct **dir_list;
  1112. XBoolean free;
  1113. XBrowserWidget br = (BrowserWidget)XtParent(wi);
  1114. X
  1115. X
  1116. X#ifdef DEBUG
  1117. X    (void) fputs("path_completion called\n", stderr);
  1118. X#endif DEBUG
  1119. X
  1120. X    clearError(br);
  1121. X
  1122. X    /* get the last occurance of the char '/' in the string  */
  1123. X    c = rindex(br->browser.labelpath, '/');
  1124. X
  1125. X    /* report if it is not possible to back out */
  1126. X    if(c == (char *)NULL) {
  1127. X    c = br->browser.labelpath;
  1128. X    /*
  1129. X    showError(br, "Burp!: could not track '/'");
  1130. X    return;
  1131. X    */
  1132. X    }
  1133. X
  1134. X    /* move forward to skip the '/' */
  1135. X    *c++;
  1136. X
  1137. X    len = strlen(c);
  1138. X
  1139. X    /* we will have trouble it these strings are not nulled */
  1140. X    bzero(name, MAXNAMLEN);
  1141. X    bzero(selection, MAXPATHLEN);
  1142. X
  1143. X    (void) strncpy(selection, br->browser.labelpath,
  1144. X        ((int)c -(int)br->browser.labelpath));
  1145. X
  1146. X    if (strcmp(selection, br->browser.basepath) == 0) {
  1147. X    dir_count = br->browser.list->count;
  1148. X    dir_list = br->browser.list->namelist;
  1149. X    free = FALSE;
  1150. X    } else {
  1151. X    dir_count = scandir(selection, &dir_list, br->browser.testProc,
  1152. X        alphasort);
  1153. X
  1154. X    if ( dir_count == -1) {
  1155. X        showError(br, selection);
  1156. X        return;
  1157. X    }
  1158. X
  1159. X    free = TRUE;
  1160. X    }
  1161. X
  1162. X    /* Enter Loop only if there is something to do */
  1163. X    if (len > 0) {
  1164. X    for(i=0; i < dir_count; i++)
  1165. X        if ( strncmp(c, dir_list[i]->d_name, len) == 0) {
  1166. X        /* if this is the first match copy if in full */
  1167. X        hit++;
  1168. X        if(hit == 1)
  1169. X            (void) strcpy(name, dir_list[i]->d_name);
  1170. X        else {
  1171. X            register int j=0;
  1172. X
  1173. X            for(; dir_list[i]->d_name[j] == name[j]; j++);
  1174. X
  1175. X            name[j] = '\0';
  1176. X
  1177. X            if(j == len)
  1178. X            break;
  1179. X        }
  1180. X        }
  1181. X
  1182. X
  1183. X    /* Ugly Ugly Ugly */
  1184. X    if(hit == 0) {
  1185. X
  1186. X        XBell(XtDisplay(br), 0);
  1187. X        showError(br, "No matches found");
  1188. X
  1189. X    } else {
  1190. X
  1191. X        /* if we matched more then once ring bell */
  1192. X        if(hit > 1) {
  1193. X        char tbuf[MAXPATHLEN];
  1194. X
  1195. X        (void) strcpy(tbuf, "\"");
  1196. X        (void) strcat(tbuf, c);
  1197. X        (void) strcat(tbuf, "\": ambiguous");
  1198. X
  1199. X        XBell(XtDisplay(br), 0);
  1200. X        showError(br, tbuf);
  1201. X        }
  1202. X
  1203. X        /* if we matched ANYTHING add the result to the current path*/
  1204. X        if(hit) {
  1205. X        (void) strcpy(c, name);
  1206. X        UpDateLabel(br, FALSE);
  1207. X        }
  1208. X    }
  1209. X
  1210. X
  1211. X    }
  1212. X
  1213. X    if(free)
  1214. X    XtFree((char *) dir_list);
  1215. X
  1216. X    return;
  1217. X}
  1218. X
  1219. Xstatic void dummy()
  1220. X{
  1221. X#ifdef DEBUG
  1222. X    (void) fputs("dummy called\n", stderr);
  1223. X#endif DEBUG
  1224. X    return;
  1225. X}
  1226. X
  1227. X/* this is call if the user types in a Cont-C */
  1228. Xstatic void kill_callback(wi)
  1229. XWidget wi;
  1230. X{
  1231. XBrowserWidget br = (BrowserWidget)XtParent(wi);
  1232. X
  1233. X    XtCallCallbacks(br, XtNcancelCallback, NULL);
  1234. X
  1235. X    return;
  1236. X}
  1237. X
  1238. Xstatic void clearError(br)
  1239. XBrowserWidget br;
  1240. X{
  1241. X
  1242. X    static Arg update_arg[] = {
  1243. X    {XtNlabel,        (XtArgVal) ">"}
  1244. X    };
  1245. X
  1246. X    errno = 0;
  1247. X
  1248. X#ifdef DEBUG
  1249. X    (void) fputs("clearError called\n", stderr);
  1250. X#endif DEBUG
  1251. X
  1252. X    XtSetValues(br->browser.b_error, update_arg, XtNumber(update_arg));
  1253. X
  1254. X    return;
  1255. X}
  1256. X
  1257. X
  1258. X/*
  1259. X * This func displays the current error in
  1260. X * a error window on the browser window
  1261. X */
  1262. Xstatic void showError(br, string)
  1263. XBrowserWidget br;
  1264. Xchar *string;
  1265. X{
  1266. Xchar    tbuf[MAXPATHLEN +80];
  1267. Xextern  char *sys_errlist[];
  1268. Xextern  int sys_nerr;
  1269. Xextern  int errno;
  1270. X
  1271. X    static Arg update_arg[] = {
  1272. X    {XtNlabel,        (XtArgVal) NULL}
  1273. X    };
  1274. X
  1275. X    if (string != (char *) NULL)
  1276. X    (void) strcpy(tbuf, string);
  1277. X    else
  1278. X    (void) strcpy(tbuf, "Error");
  1279. X
  1280. X#ifdef DEBUG
  1281. X    (void) perror(tbuf);
  1282. X#endif DEBUG
  1283. X
  1284. X    if (errno > 0 && errno < sys_nerr) {
  1285. X    (void) strcat(tbuf, ": ");
  1286. X    (void) strcat(tbuf, sys_errlist[errno]);
  1287. X    }
  1288. X
  1289. X    update_arg[0].value = (XtArgVal) tbuf;
  1290. X
  1291. X    XBell(XtDisplay(br), 0);
  1292. X
  1293. X    if(XtIsRealized(br))
  1294. X    XtSetValues(br->browser.b_error, update_arg, XtNumber(update_arg));
  1295. X
  1296. X    return;
  1297. X}
  1298. X
  1299. Xstatic void SetWorkState(br, state)
  1300. XBrowserWidget br;
  1301. XBoolean state;
  1302. X{
  1303. X
  1304. X    if (state) {
  1305. X    XDefineCursor(XtDisplay(br), XtWindow(br), br->browser.ClockCursor);
  1306. X    XDefineCursor(XtDisplay(br), XtWindow(br->browser.b_list),
  1307. X                br->browser.ClockCursor);
  1308. X    XDefineCursor(XtDisplay(br), XtWindow(br->browser.b_label),
  1309. X                br->browser.ClockCursor);
  1310. X
  1311. X
  1312. X    XtSetSensitive(br->browser.b_open, FALSE);
  1313. X    XtSetSensitive(br->browser.b_label, FALSE);
  1314. X    XtSetSensitive(br->browser.b_cancel, FALSE);
  1315. X
  1316. X    } else {
  1317. X
  1318. X    XDefineCursor(XtDisplay(br), XtWindow(br), br->browser.CrossCursor);
  1319. X    XDefineCursor(XtDisplay(br), XtWindow(br->browser.b_list),
  1320. X                br->browser.ArrowCursor);
  1321. X    XDefineCursor(XtDisplay(br), XtWindow(br->browser.b_label),
  1322. X                br->browser.CrossCursor);
  1323. X
  1324. X    XtSetSensitive(br->browser.b_open, TRUE);
  1325. X    XtSetSensitive(br->browser.b_label, TRUE);
  1326. X    XtSetSensitive(br->browser.b_cancel, TRUE);
  1327. X    }
  1328. X
  1329. X    return;
  1330. X}
  1331. X
  1332. X/**********************************************************************
  1333. X *
  1334. X * Public routines
  1335. X *
  1336. X **********************************************************************/
  1337. X
  1338. X/* none */
  1339. X
  1340. X
  1341. X/* END OF TEXT */
  1342. END_OF_FILE
  1343. if test 31119 -ne `wc -c <'Browser.c'`; then
  1344.     echo shar: \"'Browser.c'\" unpacked with wrong size!
  1345. fi
  1346. # end of 'Browser.c'
  1347. fi
  1348. if test -f 'Browser.h' -a "${1}" != "-c" ; then 
  1349.   echo shar: Will not clobber existing file \"'Browser.h'\"
  1350. else
  1351. echo shar: Extracting \"'Browser.h'\" \(2121 characters\)
  1352. sed "s/^X//" >'Browser.h' <<'END_OF_FILE'
  1353. X#if ( !defined(lint) && !defined(Pete_copyright))
  1354. X#define Pete_copyright 1
  1355. Xstatic char pete_copyright[] = "\
  1356. X Copyright 1986 by Peter Shipley All rights reserved\n\
  1357. X\n\
  1358. X Copy permission is hereby granted provided that this notice is\n\
  1359. X retained on all partial or complete copies.\n\
  1360. X\n\
  1361. X please mail questions and fixes to shipley@widow,berkeley.edu\n";
  1362. X#endif
  1363. X
  1364. X#ifndef _Browser_h
  1365. X#define _Browser_h
  1366. X
  1367. X#include <X11/Constraint.h>
  1368. X
  1369. X/***********************************************************************
  1370. X *
  1371. X * Browser Widget
  1372. X *
  1373. X ***********************************************************************/
  1374. X
  1375. X/* Parameters:
  1376. X
  1377. X Name             Class        RepType        Default Value
  1378. X ----             -----        -------        -------------
  1379. X background         Background        Pixel        XtDefaultBackground
  1380. X border             BorderColor    Pixel        XtDefaultForeground
  1381. X borderWidth         BorderWidth    Dimension    1
  1382. X defaultDistance     Thickness        int        4
  1383. X destroyCallback     Callback        Pointer        NULL
  1384. X height             Height        Dimension    computed at realize
  1385. X mappedWhenManaged   MappedWhenManaged    Boolean        True
  1386. X sensitive         Sensitive        Boolean        True
  1387. X width             Width        Dimension    computed at realize
  1388. X x             Position        Position    0
  1389. X y             Position        Position    0
  1390. X
  1391. X*/
  1392. X
  1393. X/* Constraint parameters:
  1394. X
  1395. X Name             Class        RepType        Default Value
  1396. X ----             -----        -------        -------------
  1397. X bottom             Edge        XtEdgeType    XtRubber
  1398. X fromHoriz         Widget        Widget        (left edge of browser)
  1399. X fromVert         Widget        Widget        (top of browser)
  1400. X horizDistance         Thickness        int        defaultDistance
  1401. X left             Edge        XtEdgeType    XtRubber
  1402. X resizable         Boolean        Boolean        False
  1403. X right             Edge        XtEdgeType    XtRubber
  1404. X top             Edge        XtEdgeType    XtRubber
  1405. X vertDistance         Thickness        int        defaultDistance
  1406. X
  1407. X*/
  1408. X
  1409. X
  1410. X
  1411. X#define XtNopenCallback        "openCallback"
  1412. X#define XtNcancelCallback    "cancelCallback"
  1413. X
  1414. X#define XtNdefaultDistance    "defaultDistance"
  1415. X#define XtNresizable        "resizable"
  1416. X
  1417. X#define XtCEdge            "Edge"
  1418. X#define XtCWidget        "Widget"
  1419. X
  1420. X#define XtRWidget        "Widget"
  1421. X
  1422. Xtypedef struct _BrowserClassRec    *BrowserWidgetClass;
  1423. Xtypedef struct _BrowserRec    *BrowserWidget;
  1424. X
  1425. Xextern WidgetClass browserWidgetClass;
  1426. X#endif _Browser_h
  1427. X
  1428. END_OF_FILE
  1429. if test 2121 -ne `wc -c <'Browser.h'`; then
  1430.     echo shar: \"'Browser.h'\" unpacked with wrong size!
  1431. fi
  1432. # end of 'Browser.h'
  1433. fi
  1434. if test -f 'BrowserP.h' -a "${1}" != "-c" ; then 
  1435.   echo shar: Will not clobber existing file \"'BrowserP.h'\"
  1436. else
  1437. echo shar: Extracting \"'BrowserP.h'\" \(2195 characters\)
  1438. sed "s/^X//" >'BrowserP.h' <<'END_OF_FILE'
  1439. X#if ( !defined(lint) && !defined(Pete_copyright))
  1440. X#define Pete_copyright 1
  1441. Xstatic char pete_copyright[] = "\
  1442. X Copyright 1986 by Peter Shipley All rights reserved\n\
  1443. X\n\
  1444. X Copy permission is hereby granted provided that this notice is\n\
  1445. X retained on all partial or complete copies.\n\
  1446. X\n\
  1447. X please mail questions and fixes to shipley@widow,berkeley.edu\n";
  1448. X#endif
  1449. X/* Browser widget private definitions */
  1450. X
  1451. X#ifndef _BrowserP_h
  1452. X#define _BrowserP_h
  1453. X
  1454. X#include "Browser.h"
  1455. X#include <X11/CompositeP.h>
  1456. X
  1457. Xtypedef struct {int empty;} BrowserClassPart;
  1458. X
  1459. Xtypedef struct _BrowserClassRec {
  1460. X    CoreClassPart    core_class;
  1461. X    CompositeClassPart    composite_class;
  1462. X    BrowserClassPart    browser_class;
  1463. X} BrowserClassRec;
  1464. X
  1465. Xextern BrowserClassRec browserClassRec;
  1466. X
  1467. X
  1468. Xtypedef struct _list_type {
  1469. X    char   **list;              /* a list of strings for listWidget*/
  1470. X    struct direct **namelist;
  1471. X    int    count;
  1472. X    int    *mode;
  1473. X} list_type;
  1474. X
  1475. X
  1476. Xtypedef struct _BrowserPart {
  1477. X    String    basepath;            /* Current scaned path */
  1478. X    String    labelpath;        /* Current displayed scaned path */
  1479. X    String    path;            /* starting path */
  1480. X
  1481. X    Widget    b_view;            /* Viewport widget for scrollbar*/
  1482. X    Widget    b_list;            /* listWidget, child of Viewport */
  1483. X    Widget    b_open;            /* "Open" command widget */
  1484. X    Widget    b_cancel;            /* "Cancel" command widget */
  1485. X    Widget    b_label;            /* path label */
  1486. X    Widget    b_error;            /* error output */
  1487. X
  1488. X    int       spacing;
  1489. X
  1490. X    XtWorkProc  testProc;        /* pointer to fun that returns Boolean
  1491. X                       takes a String for a arg and test
  1492. X                       if it should be included in
  1493. X                       selection list */
  1494. X    Boolean   reverse_video;
  1495. X
  1496. X    Cursor    ArrowCursor;        /* Cursor for list & command widget */
  1497. X    Cursor    CrossCursor;        /* Cursor for formWidget */
  1498. X    Cursor    ClockCursor;        /* Wait Cursor list & command widget */
  1499. X
  1500. X    XtCallbackList sel_callback;    /* callback func. for Cancel widget */
  1501. X    XtCallbackList can_callback;    /* callback func. for Open widget */
  1502. X
  1503. X    list_type *list;            /* struct containing list data */
  1504. X
  1505. X} BrowserPart;
  1506. X
  1507. Xtypedef struct _BrowserRec {
  1508. X    CorePart        core;
  1509. X    CompositePart    composite;
  1510. X    BrowserPart        browser;
  1511. X} BrowserRec;
  1512. X
  1513. X#endif _BrowserP_h
  1514. END_OF_FILE
  1515. if test 2195 -ne `wc -c <'BrowserP.h'`; then
  1516.     echo shar: \"'BrowserP.h'\" unpacked with wrong size!
  1517. fi
  1518. # end of 'BrowserP.h'
  1519. fi
  1520. if test -f 'ListWidget.patch' -a "${1}" != "-c" ; then 
  1521.   echo shar: Will not clobber existing file \"'ListWidget.patch'\"
  1522. else
  1523. echo shar: Extracting \"'ListWidget.patch'\" \(170 characters\)
  1524. sed "s/^X//" >'ListWidget.patch' <<'END_OF_FILE'
  1525. X447,453d446
  1526. X<     if ( item >= lw->list.nitems ) {
  1527. X< #ifdef DEBUG
  1528. X<     XtWarning("ListWidget: HighlightBackground:  item > nitems\n");
  1529. X< #endif DEBUG
  1530. X<     return;
  1531. X<     }
  1532. X< 
  1533. END_OF_FILE
  1534. if test 170 -ne `wc -c <'ListWidget.patch'`; then
  1535.     echo shar: \"'ListWidget.patch'\" unpacked with wrong size!
  1536. fi
  1537. # end of 'ListWidget.patch'
  1538. fi
  1539. if test -f 'Makefile' -a "${1}" != "-c" ; then 
  1540.   echo shar: Will not clobber existing file \"'Makefile'\"
  1541. else
  1542. echo shar: Extracting \"'Makefile'\" \(1189 characters\)
  1543. sed "s/^X//" >'Makefile' <<'END_OF_FILE'
  1544. XDEST          = /global/bin
  1545. X
  1546. XEXTHDRS          = /usr/include/signal.h \
  1547. X        /usr/include/stdio.h
  1548. X
  1549. XHDRS          = Browser.h \
  1550. X        BrowserP.h
  1551. X
  1552. XLDFLAGS          =  -L/global/lib
  1553. X
  1554. XCFLAGS          = -g -I/global/include
  1555. X#-DDEBUG
  1556. X
  1557. XLIBS          = -lXaw -lXmu -lXt -lX11 
  1558. X
  1559. XLINKER          = /bin/cc
  1560. X
  1561. XCC          = /bin/cc
  1562. X
  1563. XMAKEFILE      = Makefile
  1564. X
  1565. XOBJS          = Browser.o \
  1566. X        main.o
  1567. X
  1568. XPRINT          = enscript
  1569. X
  1570. XPROGRAM          = test
  1571. X
  1572. XSRCS          = Browser.c \
  1573. X        main.c
  1574. X
  1575. Xall:        $(PROGRAM)
  1576. X
  1577. X$(PROGRAM):     $(OBJS)
  1578. X        @echo "Loading $(PROGRAM) ... "
  1579. X        $(LINKER) $(LDFLAGS) $(OBJS) $(LIBS) -o $(PROGRAM)
  1580. X        @echo "done"
  1581. X
  1582. Xclean:;        /bin/rm -f $(OBJS) *~ \#* core
  1583. X
  1584. Xdepend:;    @mkmf -d -f $(MAKEFILE) PROGRAM=$(PROGRAM) DEST=$(DEST) 
  1585. X
  1586. Xindex:;        ctags -wx $(HDRS) $(SRCS)  ;
  1587. X
  1588. Xinstall:    $(PROGRAM)
  1589. X        @echo Installing $(PROGRAM) in $(DEST)
  1590. X        @install -s $(PROGRAM) $(DEST)
  1591. X
  1592. Xprint:;        @$(PRINT) $(HDRS) $(SRCS)
  1593. X
  1594. Xprogram:        $(PROGRAM)
  1595. X
  1596. Xlint:;        lint $(SRCS) -I/usr/X11 -I.
  1597. X
  1598. Xtags:           $(HDRS) $(SRCS)
  1599. X        ctags -tw $(HDRS) $(SRCS) 
  1600. X
  1601. Xupdate:        $(DEST)/$(PROGRAM)
  1602. X
  1603. X$(DEST)/$(PROGRAM): $(SRCS) $(LIBS) $(HDRS) $(EXTHDRS)
  1604. X        @make -f $(MAKEFILE) DEST=$(DEST) install
  1605. X
  1606. Xnew:        clean $(PROGRAM)
  1607. X
  1608. X###
  1609. X
  1610. XBrowser.o: BrowserP.h Browser.h
  1611. Xmain.o: Browser.h
  1612. END_OF_FILE
  1613. if test 1189 -ne `wc -c <'Makefile'`; then
  1614.     echo shar: \"'Makefile'\" unpacked with wrong size!
  1615. fi
  1616. # end of 'Makefile'
  1617. fi
  1618. if test -f 'browser.3x' -a "${1}" != "-c" ; then 
  1619.   echo shar: Will not clobber existing file \"'browser.3x'\"
  1620. else
  1621. echo shar: Extracting \"'browser.3x'\" \(3828 characters\)
  1622. sed "s/^X//" >'browser.3x' <<'END_OF_FILE'
  1623. X(Message inbox:717)
  1624. XReturn-Path: shipley%WEB.Berkeley.EDU@lilac.berkeley.edu
  1625. XReceived:  by wyse.wyse.com (5.58/Wyse master/5-13-88)
  1626. X    id AA02643; Wed, 4 Jan 89 22:53:38 PST
  1627. XFrom: shipley%WEB.Berkeley.EDU@lilac.berkeley.edu
  1628. XReceived: from lilac.Berkeley.EDU by uunet.UU.NET (5.59/1.14) 
  1629. X    id AA25181; Thu, 5 Jan 89 01:42:01 EST
  1630. XReceived: from e260-4f.berkeley.edu
  1631. X    by lilac.berkeley.edu (5.54 (CFC 4.22.3)/1.16.19)
  1632. X    id AA06780; Wed, 4 Jan 89 22:40:27 PST
  1633. XReceived: by e260-4f.berkeley.edu (3.2/SMI-3.0DEV3.9MXl)
  1634. X    id AA02312; Wed, 4 Jan 89 22:43:36 PST
  1635. XMessage-Id: <8901050643.AA02312@e260-4f.berkeley.edu>
  1636. XTo: ames!mailrus!umix!wyse.com!mcf.uucp!mikew@cad.Berkeley.EDU
  1637. XCc: shipley%widow.Berkeley.EDU@lilac.berkeley.edu, mikew@wyse.wyse.com
  1638. XSubject: Re: browser widget 
  1639. XIn-Reply-To: Your message of Wed, 04 Jan 89 10:58:55 PST.
  1640. X             <8901041858.AA00866@wyse.wyse.com> 
  1641. XDate: Wed, 04 Jan 89 22:43:32 PST
  1642. X
  1643. X
  1644. X> Could you send me a man page for the browser widget?
  1645. X> Mike Wexler(wyse!mikew)    Phone: (408)433-1000 x1330
  1646. X> Moderator of comp.sources.x
  1647. X
  1648. X.TH BrowserWidget 3X
  1649. X.SH NAME
  1650. XBrowserWidget - Dialog widet for selecting files
  1651. X.SH DESCRIPTION
  1652. XThe BrowserWidget is a Utility widget which prompts
  1653. Xthe user ror file sectection.
  1654. X.SH RESOURCES
  1655. X.TS
  1656. Xl l l l.
  1657. X_
  1658. X\fBName    Type    Default    Description\fR
  1659. X=
  1660. XXtNvalue    XtRString    NULL    T{
  1661. Xfull path to directory to start Browsing
  1662. XT}
  1663. XXtNdefaultDistance    XtRInt    10    T{
  1664. Xdistance between subwidgets inside BrowserWidget
  1665. XT}
  1666. XXtNopenCallback    XtCallbackList    NULL    Callbacks for open button
  1667. XXtNcancelCallback    XtCallbackList    NULL    Callbacks for cansel button
  1668. XXtNdestroyCallback    XtCallbackList    NULL    Callbacks for XtDestroyWidget
  1669. XXtNmappedWhenManaged    Boolean    True    Whether XtMapWidget is automatic
  1670. XXtNfunction    Boolean (*func)()    NULL    see below
  1671. XXtNreverseVideo    Boolean    FALSE    display widget in reverse video
  1672. X_
  1673. X.TE
  1674. X.IP XtNvalue
  1675. XThe resource \*QXtNvalue\*U defines the base directory which the BrowserWidget
  1676. Xuse to start querying user from.
  1677. XThis resource has no default value thus it \fBmust be given\fR.
  1678. X.\"
  1679. X.IP XtNdefaultDistance
  1680. XThe resource \*QXtNdefaultDistance\*U defines the distance
  1681. Xbetween the child widgets of the BrowserWidget.
  1682. X.\"
  1683. X.IP XtNopenCallback
  1684. XThis callback is called when the user selects a file.
  1685. X.\"
  1686. X.IP XtNcancelCallback
  1687. XThis callback is called when the user selects the cancel button.
  1688. X.\"
  1689. X.IP XtNfunction
  1690. XThis resource is a pointer to a function whose argument is
  1691. Xa pointer to a directory entry for each file in the directory
  1692. Xcurrently being scaned; the function should return TRUE if the
  1693. Xdirectory entry is to be included.
  1694. XIf this pointer is null, then all the directory entries will be included.
  1695. X.\"
  1696. X.IP "Other resources"
  1697. XThe resource for the open button is \*Qopen\*U; the resource for the cancel
  1698. Xbutton is \*Qcancel\*U. These can be used to change the default labels.
  1699. X.\"
  1700. X.SH USE
  1701. XThe BrowserWidget takes command via mouse actions or keyboard entery.
  1702. XSelection using the mouse is done by ether double clicking on the
  1703. Xdesired file of directory, or by clicking once on the desired entry
  1704. Xand selecting the open button.
  1705. XSelection using the keyboard is very much like using file completion
  1706. Xin the C-shell.
  1707. XGenerally you type a partial filename followed by an ESC character
  1708. Xand the BrowserWidget fills in the remaining unambiguous characters
  1709. Xof partial filename
  1710. XIf the user enters a Control-C the cancel callback will be called.
  1711. XSelection is done by entering a line feed for or carrage return.
  1712. X.LP
  1713. XIf the selected directory entry is a directory the directory will
  1714. Xbe followed and the menu will be redisplayed else the selected file
  1715. Xwill be returned as a part of the open callback.
  1716. X.\"
  1717. X.SH SEE ALSO
  1718. Xscandir(3)
  1719. X.\"
  1720. X.SH BUGS
  1721. XViewport sometime gets confused about the size of the ListWidget (menu)
  1722. Xand the user will be unable to use scrollbar.
  1723. XListWidget will dump core if the user mouses to quickly.
  1724. END_OF_FILE
  1725. if test 3828 -ne `wc -c <'browser.3x'`; then
  1726.     echo shar: \"'browser.3x'\" unpacked with wrong size!
  1727. fi
  1728. # end of 'browser.3x'
  1729. fi
  1730. if test -f 'main.c' -a "${1}" != "-c" ; then 
  1731.   echo shar: Will not clobber existing file \"'main.c'\"
  1732. else
  1733. echo shar: Extracting \"'main.c'\" \(2200 characters\)
  1734. sed "s/^X//" >'main.c' <<'END_OF_FILE'
  1735. X#include <stdio.h>
  1736. X#include <sys/types.h>
  1737. X#include <sys/stat.h>
  1738. X#include <sys/dir.h>
  1739. X#include <sys/param.h>
  1740. X#include <X11/Intrinsic.h>
  1741. X#include <X11/Cardinals.h>
  1742. X#include <X11/List.h>
  1743. X#include <X11/StringDefs.h>
  1744. X#include "Browser.h"
  1745. X
  1746. X
  1747. XArg      args[20];
  1748. XWidget toplevel;
  1749. X
  1750. Xstatic XrmOptionDescRec options[] = {
  1751. X{"-label",    "*label",    XrmoptionSepArg,    NULL}
  1752. X};
  1753. X
  1754. X
  1755. Xvoid Syntax(call)
  1756. X    char *call;
  1757. X{
  1758. X    (void) fprintf( stderr, "Usage: %s\n", call );
  1759. X
  1760. X    return;
  1761. X}
  1762. X
  1763. X
  1764. Xstatic void ss(wi, client_data, call_data)
  1765. XWidget wi;
  1766. Xcaddr_t client_data;
  1767. Xcaddr_t call_data;
  1768. X{
  1769. X    (void) fprintf(stderr, "select %s\n", call_data);
  1770. X
  1771. X    return;
  1772. X}
  1773. X
  1774. Xstatic void cc(wi, client_data, call_data)
  1775. XWidget wi;
  1776. Xcaddr_t client_data;
  1777. Xcaddr_t call_data;
  1778. X{
  1779. Xextern Widget toplevel;
  1780. X
  1781. X    (void) fputs("cancel\n", stderr);
  1782. X
  1783. X    XtDestroyWidget(toplevel);
  1784. X
  1785. X    exit(0);
  1786. X}
  1787. X
  1788. Xstatic void dd(wi, client_data, call_data)
  1789. XWidget wi;
  1790. Xcaddr_t client_data;
  1791. Xcaddr_t call_data;
  1792. X{
  1793. X    (void) fprintf(stderr, "all is dead\n");
  1794. X
  1795. X    return;
  1796. X}
  1797. X
  1798. Xstatic Boolean tt(d)
  1799. Xstruct direct *d;
  1800. X{
  1801. X    return !(d->d_name[0] == '.' && d->d_name[1]==0);
  1802. X}
  1803. X
  1804. Xvoid main(argc, argv)
  1805. Xunsigned int argc;
  1806. Xchar **argv;
  1807. X{
  1808. Xregister Cardinal    n;
  1809. XWidget L_widget;
  1810. Xextern Widget toplevel;
  1811. X
  1812. Xstatic XtCallbackRec cancel_call[] = {
  1813. X    { cc,         (caddr_t) NULL}, 
  1814. X    {(XtCallbackProc) NULL,    (caddr_t) NULL}
  1815. X};
  1816. X
  1817. Xstatic XtCallbackRec destroy_call[] = {
  1818. X    { dd,         (caddr_t) NULL}, 
  1819. X    {(XtCallbackProc) NULL,    (caddr_t) NULL}
  1820. X};
  1821. X
  1822. Xstatic XtCallbackRec list_call[] = {
  1823. X    { ss,         (caddr_t) NULL}, 
  1824. X    {(XtCallbackProc) NULL,    (caddr_t) NULL}
  1825. X};
  1826. X
  1827. X    toplevel = XtInitialize( NULL, "XLabel",
  1828. X                 options, XtNumber(options),
  1829. X                 &argc, argv );
  1830. X
  1831. X    n = ZERO;
  1832. X    XtSetArg(args[n], XtNvalue,        "/usr"); n++;
  1833. X    XtSetArg(args[n], XtNopenCallback,    list_call); n++;
  1834. X    XtSetArg(args[n], XtNcancelCallback,cancel_call); n++;
  1835. X    XtSetArg(args[n], XtNheight,    350); n++;
  1836. X    XtSetArg(args[n], XtNwidth,        400); n++;
  1837. X    XtSetArg(args[n], XtNfunction,    tt); n++;
  1838. X    XtSetArg(args[n], XtNdestroyCallback,    destroy_call); n++; 
  1839. X
  1840. X    L_widget = XtCreateManagedWidget( "browser", browserWidgetClass,
  1841. X        toplevel, args, n );
  1842. X
  1843. X    
  1844. X    XtRealizeWidget(toplevel);
  1845. X    XtMainLoop();
  1846. X}
  1847. END_OF_FILE
  1848. if test 2200 -ne `wc -c <'main.c'`; then
  1849.     echo shar: \"'main.c'\" unpacked with wrong size!
  1850. fi
  1851. # end of 'main.c'
  1852. fi
  1853. if test -f 'patchlevel.h' -a "${1}" != "-c" ; then 
  1854.   echo shar: Will not clobber existing file \"'patchlevel.h'\"
  1855. else
  1856. echo shar: Extracting \"'patchlevel.h'\" \(22 characters\)
  1857. sed "s/^X//" >'patchlevel.h' <<'END_OF_FILE'
  1858. X#define PATCHLEVEL 0
  1859. X
  1860. END_OF_FILE
  1861. if test 22 -ne `wc -c <'patchlevel.h'`; then
  1862.     echo shar: \"'patchlevel.h'\" unpacked with wrong size!
  1863. fi
  1864. # end of 'patchlevel.h'
  1865. fi
  1866. echo shar: End of archive 1 \(of 1\).
  1867. cp /dev/null ark1isdone
  1868. MISSING=""
  1869. for I in 1 ; do
  1870.     if test ! -f ark${I}isdone ; then
  1871.     MISSING="${MISSING} ${I}"
  1872.     fi
  1873. done
  1874. if test "${MISSING}" = "" ; then
  1875.     echo You have the archive.
  1876.     rm -f ark[1-9]isdone
  1877. else
  1878.     echo You still need to unpack the following archives:
  1879.     echo "        " ${MISSING}
  1880. fi
  1881. ##  End of shell archive.
  1882. exit 0
  1883. -- 
  1884. Mike Wexler(wyse!mikew)    Phone: (408)433-1000 x1330
  1885. Moderator of comp.sources.x
  1886.